package aQute.jpm.service; import java.security.AllPermission; import java.security.Permission; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.Set; public class TraceSecurityManager extends SecurityManager { final HashSet<Permission> had = new HashSet<Permission>(); public TraceSecurityManager() { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { Set<Permission> hadx; synchronized (TraceSecurityManager.this) { hadx = new HashSet<Permission>(TraceSecurityManager.this.had); } Set<Permission> implied = new HashSet<Permission>(); for (Permission smaller : hadx) { for (Permission larger : hadx) { if (smaller != larger && larger.implies(smaller)) implied.add(smaller); } } hadx.removeAll(implied); ArrayList<Permission> sorted = new ArrayList<Permission>(hadx); Collections.sort(sorted, new Comparator<Permission>() { public int compare(Permission a, Permission b) { if (a.getClass() == b.getClass()) { if (a.getName().equals(b.getName())) { return a.getActions().compareTo(b.getActions()); } else return a.getName().compareTo(b.getName()); } else return shorten(a.getClass().getName()).compareTo(shorten(b.getClass().getName())); } }); for (Permission p : sorted) { System.err.println(shorten(p.getClass().getName()) + ":" + p.getName() + ":" + p.getActions()); } } String shorten(String name) { int n = name.lastIndexOf('.'); if (n < 0) return name; return name.substring(n + 1); } }); } public synchronized void checkPermission(Permission perm) { if (perm.getClass() == AllPermission.class) throw new SecurityException(); if (had.contains(perm)) return; had.add(perm); } public void checkPermission(Permission perm, Object o) { checkPermission(perm); } }